﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Data;
using DataAccess;

namespace BusinessLogic
{
    public class Solicitud
    {
        #region ATRIBUTOS

        long _NroTicket;
        Persona _UnUsuario;
        string _Asunto;
        DateTime _Creada;
        string _Descripcion;
        enEstado _Estado;
        DateTime _Cerrada;
        Tecnico _UnTecnico;
        List<Mensaje> _LstMensajes;

        #endregion

        #region PROPERTIES

        public long NroTicket
        {
            get { return _NroTicket; }
            set { _NroTicket = value; }
        }

        public Persona UnUsuario
        {
            get { return _UnUsuario; }
            set { _UnUsuario = value; }
        }

        public string Asunto
        {
            get { return _Asunto; }
            set { _Asunto = value; }
        }

        public DateTime Creada
        {
            get { return _Creada; }
            set { _Creada = value; }
        }

        public string Descripcion
        {
            get { return _Descripcion; }
            set { _Descripcion = value; }
        }

        public enEstado Estado
        {
            get { return _Estado; }
            set { _Estado = value; }
        }

        public DateTime Cerrada
        {
            get { return _Cerrada; }
            set { _Cerrada = value; }
        }

        public Tecnico UnTecnico
        {
            get { return _UnTecnico; }
            set { _UnTecnico = value; }
        }

        public List<Mensaje> LstMensajes
        {
            get { return _LstMensajes; }
            set { _LstMensajes = value; }
        }

        #endregion

        #region CONSTRUCTORES

        //public Solicitud() { }
        public Solicitud(){}
        public Solicitud(Persona pUsu, string pAsunto, string pDesc)
        {
            _UnUsuario = pUsu;
            _Asunto = pAsunto;
            _Descripcion = pDesc;
        }
        public Solicitud(long pNro, Persona pUsu, string pAsunto, DateTime pFechCre, string pDesc, enEstado pEst, DateTime pFechCerr, Tecnico pTecnico, List<Mensaje> pLstMen)
        {
            _NroTicket = pNro;
            _UnUsuario = pUsu;
            _Asunto = pAsunto;
            _Creada = pFechCre;
            _Descripcion = pDesc;
            _Estado = pEst;
            _Cerrada = pFechCerr;
            _UnTecnico = pTecnico;
        }
        #endregion

        #region METODOS

        //Insertar solicitud.
        public void insertarSoicitud()
        {
            ControllerSolicitud.getInstancia().insertSolicitud(this.Asunto, this.Descripcion, (Int32)this.UnUsuario.NroFuncionario);
        }

        //Asignar un tecnico a una solicitud.
        public static void asignarTecnico(long pNroTec, long pNroSol)
        {
            ControllerSolicitud.getInstancia().asignarTecnico((Int32)pNroTec, (Int32)pNroSol);
        }

        //Cambiar estado de una solicitud.
        public static void cambiarEstado(enEstado pEst, long pNroSol)
        {
            string pEstado = "";
            if (pEst == enEstado.Abierto)
            {
                pEstado = "Abierto";
            }
            else if(pEst == enEstado.Cancelado)
            {
                pEstado = "Cancelado";
            }
            else if(pEst == enEstado.Cerrado)
            {
                pEstado = "Cerrado";
            }
            ControllerSolicitud.getInstancia().CambiarEstado(pEstado, (Int32)pNroSol);
        }

        //Parsear un registro de la tabla solicitudes a un objeto solicitud.
        public static List<Solicitud> parseRegToSolicitud(DataTable pTable)
        {
            //Recibe como parametro una data table con los registros correspondientes a una o mas
            //solicitudes y devuelve una lista de objetos "Solicitud".
            List<Solicitud> lstSol = new List<Solicitud>();

            //Se recorre la tabla.
            for (int i = 0; i < pTable.Rows.Count; i++)
            {
                //Se crea una nueva instancia de la clase Persona.
                Solicitud unaSol = new Solicitud();
                unaSol.NroTicket = long.Parse(pTable.Rows[i]["solnroticket"].ToString());
                unaSol.Asunto = pTable.Rows[i]["solasunto"].ToString();
                unaSol.Descripcion = pTable.Rows[i]["soldescripcion"].ToString();
                string estado = pTable.Rows[i]["solestado"].ToString();

                if(estado == "Cerrado")
                {
                    unaSol.Estado = enEstado.Cerrado;
                }else if(estado == "Abierto")
                {
                    unaSol.Estado = enEstado.Abierto;
                }
                else
                {
                    unaSol.Estado = enEstado.Cancelado;
                }
                unaSol.UnUsuario = Usuario.getUsuarioByNro(long.Parse(pTable.Rows[i]["solnrousuario"].ToString()));
                //Si la solucion tiene asignado un tecnico se le asigna el mismo al objeto, sino, se deja nulo.
                unaSol.UnTecnico = pTable.Rows[i]["solnrotecnico"].ToString() != "" ? Tecnico.getTecnicoByNro(long.Parse(pTable.Rows[i]["solnrotecnico"].ToString())) : null;
                unaSol.Creada = DateTime.Parse(pTable.Rows[i]["solcreada"].ToString());
                //Si tiene indicada una fecha de cerrada o cancelada, se le asigna al objeto.
                if(pTable.Rows[i]["solcerrada"].ToString() != "")
                {
                    unaSol.Cerrada = DateTime.Parse(pTable.Rows[i]["solcerrada"].ToString());
                }
                //Se agrega la solicitud a la lista.
                lstSol.Add(unaSol);
            }
            return lstSol;
        }

        //Dar solicitud por numero de ticket.
        public static Solicitud getSolicitudByNro(long pNro)
        {
            //Se declara una variable de tipo Solicitud para el retorno.
            Solicitud unaS = null;
            //Se recibe un datatable conteniendo la solicitud correspondiente al numero dado.
            DataTable dt = ControllerSolicitud.getInstancia().getSolicitudByNro((Int32)pNro);
            //Si existe, se parsea y devuelve al tipo Solicitud solo el primer item de la lista porque 
            //solo puede haber uno, ya que la consulta utilizada es por numnero de solicitud.
            //Luego se le asigna a la propiedad lstMensajes la lista de mensajes asociados a la solicitud.
            if((parseRegToSolicitud(dt)).Count() != 0)
            {
                unaS = (parseRegToSolicitud(dt))[0];
                unaS.LstMensajes = Mensaje.getMensajesByNroSolicitud(unaS.NroTicket);
            }
            return unaS;
        }

        //Dar lista de Solicitudes por asignacion de tecnico.
        public static DataTable getSolicitudesByAsigTec(bool pAsigTec)
        {
            return ControllerSolicitud.getInstancia().getSolicitudesByAsignacion(pAsigTec);
        }
     
        //Dar lista de Solicitudes por numero de tecnico.
        public static DataTable getSolicitudesByNroTecnico(long pNroTec)
        {
            return ControllerSolicitud.getInstancia().getSolicitudesByNroTecnico((Int32)pNroTec);
        }

        //Dar lista de solicitudes por numero de usuario  y estado de la solicitud.
        public static DataTable getSolicitudesByNroUsuAndEstado(long pNroUsu, string pEst)
        {
            return ControllerSolicitud.getInstancia().getSolByNroUsuAndEstado((Int32)pNroUsu, pEst);
        }

        //Dar lista de solicitudes asignadas por Nro.
        public static DataTable getSolByTecAndAsig(long pNroTec)
        {
            return ControllerSolicitud.getInstancia().getSolicitudesByTecAsig((Int32)pNroTec);
        }

        //Dar lista de solicitudes ingresadas y resueltas por mes y año (WebService).
        public static List<string> getSolByMesAndAnio()
        {
            return ControllerSolicitud.getInstancia().getListSolByMesAndAnio();
        }
        #endregion
    }
}
